# 数据容器：是一种可以容纳多份数据的数据类型，容纳的每一份数据称为1个元素，每一个元素可以是任意类型的数据，如字符串、数字、布尔型等。
# 学习数据容器，是为了批量存储或批量使用多份数据。
# 数据容器分为五类，分别是列表、元组、字符串、集合、字典。
# 列表：由一系列按特定顺序排列的元素组成，它是python中的内置的可变序列。
# 特点：
# 1：支持增删改查
# 2：列表中的数据可变，但内存地址不会改变
# 3：用[]来表示列表类型，两个相邻元素间使用逗号进行分隔，且同一个列表中，元素可以重复，元素类型也可以不同，因为它们之间没有任何关系
# 4：支持索引和切片来进行操作
# 如果将函数定义为class（类）的成员，那么函数会被称之为：方法
# 方法对比函数其使用格式不同，函数通过其名称直接调用，并传递必要的参数，而方法通过实例对象调用，并使用点（.）语法，再传递必要的参数。
li=[]
li=[1,2,3,"你好"]
print(len(li)) # len函数可以返回对象中的元素个数，从1开始计算(列表长度)
# 查找访问
listA=['abcd',785,12.23,'qiuzhi',True]
print(listA.index(785))#获取指定元素首次出现的下标
print(id(listA))#返回对象在内存中的地址（或称为身份标识）
print(listA)#输出完整的列表
print(listA[0])#输出第一个元素(索引)
print(listA[1:3])#从第二个元素开始到第三个元素(切片)
print(listA[2:])#从第三个元素开始到最后所有的元素(切片)
print(listA[::-1])#倒序输出，从右往左遍历(切片)
print(listA*2)#输出多次列表中的数据【复制】
# 添加元素
listA.append(['fff','ddd'])#末尾添加元素(追加)
print(id(listA))#重新赋值内存地址会变化，但是增删改不会
print(listA)
listA.insert(1,'这是我刚插入的数据')#指定位置插入元素(插入)，将原位置元素与之后的元素都右移一个位置
print(listA)
rsData=list(range(10))#转换为列表对象
listA.extend(rsData)#将一个可迭代对象中的全部元素依次添加到列表末尾(扩展)
print(listA)
# 修改元素
listA[0]='peter'
print('修改之后',listA)#修改列表中的元素只需要通过索引获取该元素，然后再为其重新赋值即可
# 删除元素
listB=list(range(10,50))
print(listB)
del listB[0]#删除列表中第一个元素
print(listB)
del listB[1:3]#批量删除多项数据(切片)
print(listB)
listB.remove(20)#根据元素值删除指定的元素(左边找到的第一个元素)
print(listB)
listB.pop(0)#根据索引删除指定元素，并返回该元素让你能够接着使用它，无参数默认删除最后一个元素
print(listB)
listB.index(19)
print(listB.count(21))#获取指定元素出现的次数
print(listB.index(19))#获取指定元素首次出现的下标
print(listB.index(19,3,25))#获取范围内指定元素首次出现的下标
print(listB.clear())#清空列表内容
#对列表进行排序p64
# 准备列表
my_list = [["a", 33], ["b", 55], ["c", 11]]
# 排序，基于带名函数
def choose_sort_key(element):
    return element[1]
my_list.sort(key=choose_sort_key, reverse=True)#如果给定了一个关键函数，则将其应用于每个列表项一次，并根据其函数值对其进行升序或降序排序。默认升序排序，反向标志可以设置为按降序排序。
print(my_list)
# 排序，基于lambda匿名函数
my_list = [["a", 33], ["b", 55], ["c", 11]]
my_list.sort(key=lambda element: element[1], reverse=True)
print(my_list)
# 列表推导式（又称列表解析式）提供了一种简明扼要的方法来创建列表。
# 它的结构是在一个中括号里包含一个表达式，然后是一个for语句，然后是 0 个或多个 for 或者 if 语句。那个表达式可以是有返回值的函数。返回结果将是一个新的列表，在这个以 if 和 for 语句为上下文的表达式运行完成之后产生。
# 列表推导式的执行顺序：各语句之间是嵌套关系，左边第二个语句是最外层，依次往右进一层，左边第一条语句是最后一层。
a = [x*y for x in range(1, 5) if x > 2 for y in range(1, 4) if y < 3]
# 他的执行顺序是:
a = []
for x in range(1,5):
    if x > 2:
        for y in range(1,4):
            if y < 3:
                a.append(x*y)